/*
 * Copyright (c) 2006-2017, Yunnan Sanjiu Network technology Co., Ltd.
 * 
 * All rights reserved.
 */
package com.niguang.work.labour.common.util;


import org.apache.commons.lang.StringUtils;

/**
 * Title:金额处理工具类
 *
 * @author Administrator
 *         Detail:金额处理工具类（转换成大写金额）
 */
public class MoneyUtil {

    /**
     * 将阿拉伯数字型的金额转换成大写金额，如211234567890.23转换后为：贰仟壹佰壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾元贰角叁分
     * 注意：最大支持小数点前12位数字，即千亿元；小数点后只保留2位，后面的位数截断。
     *
     * @param lower 要转换的阿拉伯数字型的金额，最大支持小数点前12位数字。
     * @return
     */
    public static String formatMoneyCN(double lower) {
        if (lower == 0) {
            return "零";
        }
        if (Math.abs(lower) > 1000000000000d) {
            return "金额太大！";
        }
        String money = "";
        boolean isNegative = false;
        if (lower < 0) {
            lower = Math.abs(lower);
            isNegative = true;
        }
        String num = "零壹贰叁肆伍陆柒捌玖";
        String[] unit = {"元", "拾", "佰", "仟", "万", "拾万", "佰万", "仟万", "亿", "拾亿", "佰亿", "仟亿"};
        // 将金额转换为字符串
        String s = String.valueOf(lower);
        // 判断s是否包含'+',如1.67E+4
        int a = s.indexOf("+");
        // 判断s是否包含'E',如1.67E+4
        int e = s.indexOf("E");
        // 如果包含'E'(该金额是以科学记数法表示,则转换成普通表示法)
        if (e != -1) {
            int index = 0; // 指数值
            if (a == -1) {
                index = Integer.parseInt(s.substring(e + 1)); // 取得指数值
            } else {
                index = Integer.parseInt(s.substring(a + 1)); // 取得指数值
            }
            String sub1 = s.substring(0, e); // 取得尾数值
            int dot = sub1.indexOf("."); // 尾数的小数点位置
            // 如果不含有小数点,则在后面补index个'0'
            if (dot == -1) {
                for (int i = 1; i <= index; i++) {
                    s = sub1 + "0";
                }
            } else { // 如果含有小数点,则向后移动小数点index位
                String sub11 = sub1.substring(0, dot); // 小数点前面的字串
                String sub12 = sub1.substring(dot + 1); // 小数点后面的字串
                if (index >= sub12.length()) {
                    int j = index - sub12.length();
                    for (int i = 1; i <= j; i++) {
                        sub12 = sub12 + "0";
                    }
                } else {
                    sub12 = sub12.substring(0, index) + "." + sub12.substring(index);
                }
                s = sub11 + sub12;
            }
        }
        int sdot = s.indexOf("."); // s中小数点的位置
        String beforeDot = ""; // 小数点前面的字串
        String afterDot = ""; // 小数点后面的字串
        // 如果包含小数点
        if (sdot != -1) {
            beforeDot = s.substring(0, sdot);
            afterDot = s.substring(sdot + 1);
        } else { // 不包含小数点
            beforeDot = s;
        }
        int bl = beforeDot.length();
        boolean zero = false; // 数字是否为零
        int z = 0; // '0'的个数
        // 逐位取数字
        for (int j = 0, i = bl - 1; j <= bl - 1; j++, i--) {
            int number = Integer.parseInt(String.valueOf(beforeDot.charAt(j)));
            if (number == 0) {
                zero = true;
                z++;
            } else {
                zero = false;
                z = 0;
            }
            if (zero && z == 1) {
                money += "零";
            } else if (zero) {
            } else if (!zero) {
                money += num.substring(number, number + 1) + unit[i];
            }
        }
        // 删去多余的'万'和'亿'
        for (int i = 1; i <= 2; i++) {
            String ss = "";
            if (i == 1) {
                ss = "万";
            } else {
                ss = "亿";
            }
            int last = money.lastIndexOf(ss);
            if (last != -1) {
                String moneySub1 = money.substring(0, last);
                String moneySub2 = money.substring(last, money.length());
                int last2 = moneySub1.indexOf(ss);
                while (last2 != -1) {
                    moneySub1 = moneySub1.substring(0, last2) + moneySub1.substring(last2 + 1, moneySub1.length());
                    last2 = moneySub1.indexOf(ss);
                }
                money = moneySub1 + moneySub2;
            }
        }
        // money中是否包含'元'
        int yuan = money.indexOf("元");
        // 如果不包含'元'
        if (yuan == -1) {
            int zi = money.lastIndexOf("零");
            // 如果最后一位字符为'零',则删除它
            if (zi == money.length() - 1) {
                money = money.substring(0, money.length() - 1) + "元"; // 在money最后加上'元'
            }
        }
        // 如果小数点后面的字串不为空,则处理'角','分'
        if (!"".equals(afterDot)) {
            int al = afterDot.length();
            if (al > 2) { // 如果字串长度大于2,则截断
                afterDot = afterDot.substring(0, 2);
                al = afterDot.length();
            }
            // 如果字符串不为'0'或'00',则处理,否则不进行处理
            if (!"0".equals(afterDot) && !"00".equals(afterDot)) {
                // 逐位取得字符
                for (int i = 0; i < al; i++) {
                    int number = Integer.parseInt(String.valueOf(afterDot.charAt(i)));
                    if (number != 0 && i == 0) {
                        money += num.substring(number, number + 1) + "角";
                    } else if (number != 0 && i == 1) {
                        money += num.substring(number, number + 1) + "分";
                    } else if (number == 0 && i == 0) {
                        money += "零";
                    }
                }
            }
        }
        // 如果不包含'角','分'则在最后加上'整'字
        if (money.indexOf("角") == -1 && money.indexOf("分") == -1) {
            money += "整";
        }
        // 处理小于1的小数
        if (Math.abs(lower) < 1) {
            if (money.startsWith("元")) {
                money = money.substring(1);
            }
            if (money.startsWith("零")) {
                money = money.substring(1);
            }
        }
        // 处理负数
        if (isNegative) {
            money = "负" + money;
        }
        return money;
    }

    public static String formatMoney2Decimal(String str) {
        if (StringUtils.isBlank(str) || "null".equals(str)) {
            return "0.00";
        }
        // 最后返回的数值
        String monStr = "";
        // 尾数的小数点位置
        int index = str.indexOf(".");
        if (index == -1) {
            monStr = str + ".00";
        } else {
            // 小数点前面的字串
            String sub1 = str.substring(0, index);
            // 小数点后面的字串
            String sub2 = str.substring(index + 1);
            if (sub2.length() == 0) {
                sub2 = "00";
            }
            if (sub2.length() == 1) {
                sub2 = sub2 + "0";
            }
            if (sub2.length() >= 2) {
                sub2 = sub2.substring(0, 2);
            }
            monStr = sub1 + "." + sub2;
        }
        return monStr;
    }

    public static void main(String[] args) {
        String s = MoneyUtil.formatMoney2Decimal(99.639 + "");
        System.out.println(s);
    }
}
